<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    function Cat(name, color) {
        // {}
        // this -> {}

        this.name = name;
        this.color = color;

        // 公有的属性和方法 => 重复声明 => 占内存
        // this.species = "猫科";
        // this.call = function () {
        //     console.log("喵喵");
        // }
        // this.skill = function () {
        //     console.log("捉老鼠");
        // }

        // return this;
    }
    // console.dir(Cat);

    // prototype  原型对象
    // 目的:把实例化对象 公有的属性和方法提取出来 => 放到公共的位置(prototype) => 供所有的实例化对象访问

    // 注意: 公有的属性和方法提取出来 虽然存储在原型对象(prototype)上,但是供所有的实例化对象访问  => 函数调用时属于谁,this就指向谁  => this指向调用此方法的实例化对象
    // Cat.prototype.species = "猫科";
    // Cat.prototype.call = function () {
    //     console.log("喵喵");
    // }
    // Cat.prototype.skill = function () {
    //     console.log("捉老鼠");
    // }
    // Cat.prototype.say = function () {
    //     // this指向调用此方法的实例化对象
    //     // console.log("this", this);
    //     console.log(this.name, this.color);
    // }


    // constructor   构造器属性
    // 1. 默认存储在构造函数的原型对象上(prototype),指向构造函数本身
    // 2. 所有的实例化对象都可以访问 => 通过constructor属性可以找到创建该实例化对象的构造函数

    // Cat.prototype.constructor = Cat;

    console.log(Cat.prototype);
    console.log(Cat.prototype.constructor === Cat);





    var Tom = new Cat("Tom", "colorfulのblack");
    console.log(Tom);
    // 实例化对象属性和方法的查找机制
    // 1. 实例化对象 自己有 就找自己的
    // console.log(Tom.name, Tom.color);

    // 2. 自己没有就找创建该实例化对象的构造函数的原型对象  (Cat.prototype)
    // console.log(Tom.species);
    // console.log(Tom.call);
    // console.log(Tom.skill);

    // Tom.call();
    // Tom.say();   // 函数调用时属于谁 this就指向谁

    console.log(Tom.constructor === Cat);




    var Kitty = new Cat("Kitty", "pink");
    console.log(Kitty);

    console.log(Kitty.constructor === Cat);






</script>

</html>